package br.com.casablanca.viewbean;

import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import br.com.casablanca.dto.LancamentoDTO;
import br.com.casablanca.exception.RegraNegocioException;
import br.com.casablanca.services.LancamentoService;
import br.com.casablanca.utils.CasablancaUtils;
import br.com.casablanca.utils.Constants;


public class LancamentoBean {  
	private LancamentoDTO lancamento;
	private List<LancamentoDTO> lancamentos;
	private Date filtroData;
	
	public String iniciar() {
		lancamento = new LancamentoDTO();
		return "cadastroLancamento";
	}

	public String listar() {
		FacesContext context = FacesContext.getCurrentInstance();
		try {
			this.lancamentos = new LancamentoService().listar(filtroData);
			if(CasablancaUtils.isNullOrEmpty(this.lancamentos)){
				FacesMessage msg = new FacesMessage(Constants.MSG_NENHUM_REGISTRO);
				msg.setSeverity(FacesMessage.SEVERITY_INFO);
				context.addMessage(null, msg);
				this.lancamentos = null;
			}
		} catch (RegraNegocioException e) {
			context.addMessage(null,new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
		} catch (Exception e) {
			return CasablancaUtils.trataErro(context, e);
		}
		return "listaLancamento";
	}
	
	public String limpar() {
		if(lancamento != null && lancamento.getId() != null){
			Long id = new Long(lancamento.getId());
			lancamento = new LancamentoDTO();
			lancamento.setId(id);
		} else {
			lancamento = new LancamentoDTO();
		}
		return "cadastroLancamento";
	}
	
	public String salvar() {
		FacesContext context = FacesContext.getCurrentInstance();
		try {
			new LancamentoService().incluir(lancamento);
			lancamento = new LancamentoDTO();
			FacesMessage msg = new FacesMessage(Constants.MSG_INCLUIR_SUCESSO);
			msg.setSeverity(FacesMessage.SEVERITY_INFO);
			context.addMessage(null, msg);
		} catch (RegraNegocioException e) {
			context.addMessage(null,new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
			lancamento.setId(null);
		} catch (Exception e) {
			return CasablancaUtils.trataErro(context, e);
		}
		return "cadastroLancamento";
	}

	public String excluir() {
		FacesContext context = FacesContext.getCurrentInstance();
		try {
			new LancamentoService().excluir(this.lancamento);
			this.lancamento = null;
			FacesMessage msg = new FacesMessage(Constants.MSG_EXCLUSAO_SUCESSO);
			msg.setSeverity(FacesMessage.SEVERITY_INFO);
			context.addMessage(null, msg);
			
			this.lancamentos = new LancamentoService().listar(filtroData);
			
			if(this.lancamentos == null || this.lancamentos.isEmpty()){
				msg = new FacesMessage(Constants.MSG_NENHUM_REGISTRO);
				msg.setSeverity(FacesMessage.SEVERITY_INFO);
				context.addMessage(null, msg);
			}
		} catch (RegraNegocioException e) {
			context.addMessage(null,new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
		} catch (Exception e) {
			e.printStackTrace();
			FacesMessage msg = new FacesMessage("Erro inesperado!");
			msg.setSeverity(FacesMessage.SEVERITY_ERROR);
			context.addMessage(null, msg);
		}

		return "listaLancamento";
	}

	public String alterar() {
		FacesContext context = FacesContext.getCurrentInstance();
		try {
			new LancamentoService().alterar(lancamento);
			FacesMessage msg = new FacesMessage(Constants.MSG_ALTERAR_SUCESSO);
			msg.setSeverity(FacesMessage.SEVERITY_INFO);
			context.addMessage(null, msg);
		} catch (RegraNegocioException e) {
			context.addMessage(null,new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
		} catch (Exception e) {
			return CasablancaUtils.trataErro(context, e);
		}
		return "cadastroLancamento";
	}

	public LancamentoDTO getLancamento() {
		return lancamento;
	}

	public void setLancamento(LancamentoDTO lancamento) {
		this.lancamento = lancamento;
	}

	public List<LancamentoDTO> getLancamentos() {
		return lancamentos;
	}

	public void setLancamentos(List<LancamentoDTO> lancamentos) {
		this.lancamentos = lancamentos;
	}

	public Date getFiltroData() {
		return filtroData;
	}

	public void setFiltroData(Date filtroData) {
		this.filtroData = filtroData;
	}
	
}
